package com.netty8018.userguide.time;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelFutureListener;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;

/**
 * @author liyanhao
 * @Date 2023-02-04 16:28
 */
public class TimeServerHandler extends ChannelInboundHandlerAdapter {
    //如前所述，当建立连接并准备好生成流量时，
    // 将调用该方法。让我们编写一个 32 位整数来表示此方法中的当前时间。channelActive()
    @Override
    public void channelActive(final ChannelHandlerContext ctx) throws Exception {
        //要发送新消息，我们需要分配一个新的缓冲区，其中包含该消息。
        // 我们将写入一个 32 位整数，因此我们需要一个容量至少为 4 字节的 ByteBuf。
        // 通过获取当前的字节分配器并分配新的缓冲区。ChannelHandlerContext.alloc()
        final ByteBuf time = ctx.alloc().buffer(4);
        time.writeInt((int) (System.currentTimeMillis() / 100L + 2208988800L));
        final ChannelFuture channelFuture = ctx.writeAndFlush(time);
        channelFuture.addListener(new ChannelFutureListener() {
            @Override
            public void operationComplete(ChannelFuture future) throws Exception {
                assert channelFuture == future;
                ctx.close();
            }
        });
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        cause.printStackTrace();
        ctx.close();
    }
}
